package com.chen;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * 描述：JsonUtil工具类
 * 
 * <pre>
 * HISTORY
 * ****************************************************************************
 *  ID   DATE           PERSON          REASON
 *  1    2015年3月7日      sfit0250         Create
 * ****************************************************************************
 * </pre>
 * 
 * @author sfit0250
 * @since 1.0
 */
public class JsonUtils {

    private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
    private static Feature[] features = {};
    private static final String MSG_JSON_PARSE_ERROR = "解析json错误: class: %s, json: %s";
    private static final String MSG_JSON_PARSE_ERROR_1 = "解析json错误, json: ";
    private static final String MSG_TO_JSON_ERROR = "转换json错误";

    private JsonUtils() {

    }

    static {
        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
        // 小并发，小处理量情况下，fastjson的速度不如gson和jackson。
        // 在并发量和处理量加大之后，fastjson的解析速度是最快的，生成json的速度和其它两个差不多。
    }

    /**
     * json 转换成 Object
     * 
     * @param json
     * @param clazz
     * @return
     */
    public static <T> T json2Object(String json, Class<T> clazz) {
        try {
            return JSON.parseObject(json, clazz, features);
        } catch (Exception e) {
            throw new JsonException(String.format(MSG_JSON_PARSE_ERROR, clazz.getName(), json), e);
        }
    }

    /**
     * json 转换成 集合
     * 
     * @param json
     * @param clazz
     * @return
     */
    public static <T> List<T> json2Array(String json, Class<T> clazz) {
        try {
            return JSON.parseArray(json, clazz);
        } catch (Exception e) {
            throw new JsonException(String.format(MSG_JSON_PARSE_ERROR, clazz.getName(), json), e);
        }
    }

    public static <T> T json2Object(String json, TypeRef<T> tr) {
        try {
            return JSON.parseObject(json, tr.getType(), features);
        } catch (Exception e) {
            logger.error("", e);
            throw new JsonException(String.format(MSG_JSON_PARSE_ERROR, tr.getType().getTypeName(), json), e);
        }
    }

    public static JsonNavigator json2Object(String json) {
        try {
            return new JsonNavigator(JSON.parseObject(json, features));
        } catch (Exception e) {
            throw new JsonException(MSG_JSON_PARSE_ERROR_1 + json, e);
        }
    }

    /**
     * obj 转换成json
     * 
     * @param entity
     * @return
     */
    public static <T> String object2Json(T entity) {
        try {
            return JSON.toJSONString(entity, SerializerFeature.WriteDateUseDateFormat);
        } catch (Exception e) {
            logger.error("", e);
            throw new JsonException(MSG_TO_JSON_ERROR, e);
        }
    }

    /**
     * obj 转换成json（不使用属性SerializerFeature.WriteDateUseDateFormat）
     * 
     * @param entity
     * @return
     */
    public static <T> String object2JsonWithoutDF(T entity) {
        try {
            return JSON.toJSONString(entity);
        } catch (Exception e) {
            logger.error("", e);
            throw new JsonException(MSG_TO_JSON_ERROR, e);
        }
    }
}
